package es.uned.etsii.si3.taller.servlets;

import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.struts2.interceptor.SessionAware;

import com.j256.ormlite.stmt.QueryBuilder;
import com.j256.ormlite.stmt.Where;
import com.opensymphony.xwork2.ActionSupport;

import es.uned.etsii.si3.taller.EmpleadoTaller;
import es.uned.etsii.si3.taller.FactoriaDAO;
import es.uned.etsii.si3.taller.FactoriaFunciones;
import es.uned.etsii.si3.taller.ParteTrabajo;
import es.uned.etsii.si3.taller.Reparacion;
import es.uned.etsii.si3.taller.Usuario;
import es.uned.etsii.si3.taller.misc.ProporcionaFuncionalidad;

public class JSRecepcionar extends ActionSupport implements SessionAware {

	private static final long serialVersionUID = 1L;
	
	private  	Map<String, Object>		userSession;
	
	private		EmpleadoTaller			datosEmpleado;
	public		EmpleadoTaller			getDatosEmpleado()							{ return this.datosEmpleado; }
	public		void 					setDatosEmpleado(Usuario uS) throws SQLException {
		QueryBuilder<EmpleadoTaller, Integer> eTQb;
		eTQb = FactoriaDAO.getDao(EmpleadoTaller.class).queryBuilder();
		Where<EmpleadoTaller, Integer> wETQb = eTQb.where();			
		wETQb.eq(EmpleadoTaller.ID_USUARIO_FIELD_NAME, uS);			
		List<EmpleadoTaller> lista = wETQb.query();
		this.datosEmpleado = lista.get(0);
	}
	
	private 	ParteTrabajo			parteSeleccionado = null;
	public 		ParteTrabajo			getParteSeleccionado() 						{ return this.parteSeleccionado; }
	public 		void					setParteSeleccionado(ParteTrabajo pT) 		{ this.parteSeleccionado = pT; }

	private 	static int 				parteSeleccionadoID = -1;
	public 		int						getParteSeleccionadoID() 					{ return JSRecepcionar.parteSeleccionadoID; }
	public 		void					setParteSeleccionadoID(int i) 				{ JSRecepcionar.parteSeleccionadoID = i; }
	
	private 	Reparacion				reparacionSeleccionado = null;
	public 		Reparacion				getReparacionSeleccionado()					{ return this.reparacionSeleccionado; }
	public 		void					setReparacionSeleccionado(Reparacion r)		{ this.reparacionSeleccionado = r; }

	private 	static int 				reparacionSeleccionadoID = -1;
	public 		int						getReparacionSeleccionadoID() 				{ return JSRecepcionar.reparacionSeleccionadoID; }
	public 		void					setReparacionSeleccionadoID(int i) 			{ JSRecepcionar.reparacionSeleccionadoID = i; }

	private 	List<Reparacion>		listaReparaciones;
	public		List<Reparacion>		getListaReparaciones()						{ return this.listaReparaciones; }
	public		void					setListaReparaciones(List<Reparacion> l)	{ this.listaReparaciones = l; }


	private		String					fechaEntradaString;
	public		String					getFechaEntradaString()						{ return this.fechaEntradaString; }
	public		void					setFechaEntradaString(String s)				{ this.fechaEntradaString = s; }
	
	public JSRecepcionar() {
		super();
	}
	

	/**
	 * Carga las reparaciones pendientes de recepcionar por el jefe de sección 
	 * @return actionerror
	 * @throws SQLException
	 */
	@ProporcionaFuncionalidad(identificador = FactoriaFunciones.JEFE_SECCION_LISTAR_V_RECEPCIONABLES)
	public String cargarReparaciones() throws SQLException {
		String res = SUCCESS;
		QueryBuilder<Reparacion, Integer> reparacionQb = FactoriaDAO.getDao(Reparacion.class).queryBuilder();
		Where<Reparacion, Integer> wReparacionQb = reparacionQb.where();		
		wReparacionQb.eq(Reparacion.ID_SECCION_FIELD_NAME, this.getDatosEmpleado().getSeccion());
		wReparacionQb.and().isNull(Reparacion.FECHAENTRADA_FIELD_NAME);
		//parar poder ser recepcionado, no puede estar ahora mismo en ninguna otra sección
		List<Reparacion> lRep = new ArrayList<Reparacion>();
		for ( int i = 0; i<reparacionQb.query().size(); i++ ) {
			 if ( !ahoraEnReparacion(reparacionQb.query().get(i)) ) {
				 lRep.add(reparacionQb.query().get(i));
			 }
		}
		this.setListaReparaciones(lRep);
		return res;
	}
	
	/**
	 * Muestra los datos de una reparación dada
	 * @param rep reparación a gestionar
	 * @return actionerror
	 * @throws SQLException
	 */
	public boolean ahoraEnReparacion(Reparacion rep) throws SQLException {
		boolean res = false;
		QueryBuilder<Reparacion, Integer> reparacionQb = FactoriaDAO.getDao(Reparacion.class).queryBuilder();;
		Where<Reparacion, Integer> wReparacionQb = reparacionQb.where();
		wReparacionQb.eq(Reparacion.ID_PARTETRABAJO_FIELD_NAME, rep.getParteTrabajo());
		wReparacionQb.and().isNotNull(Reparacion.FECHAENTRADA_FIELD_NAME);
		wReparacionQb.and().isNull(Reparacion.FECHAFIN_FIELD_NAME);
		if ( reparacionQb.query().size() > 0 ) {
			res = true;
		}
		return res;
	}

	/**
	 * Carga la lista de reparaciones pendientes
	 * @return actionerror
	 * @throws SQLException
	 */
	@ProporcionaFuncionalidad(identificador = FactoriaFunciones.JEFE_SECCION_LISTAR_SECCIONES_PENDIENTES_V)
	public String cargarReparacionesPendientes() throws SQLException {
		String res = SUCCESS;
		this.setReparacionSeleccionadoID(this.getReparacionSeleccionadoID());
		this.setReparacionSeleccionado(FactoriaDAO.recuperar(Reparacion.class, this.getReparacionSeleccionadoID()));
		this.setParteSeleccionado(FactoriaDAO.recuperar(ParteTrabajo.class, this.getReparacionSeleccionado().getParteTrabajo().getId()));
		QueryBuilder<Reparacion, Integer> reparacionQb = FactoriaDAO.getDao(Reparacion.class).queryBuilder();
		Where<Reparacion, Integer> wReparacionQb = reparacionQb.where();		
		wReparacionQb.eq(Reparacion.ID_PARTETRABAJO_FIELD_NAME, this.getParteSeleccionado());
		wReparacionQb.and().isNull(Reparacion.FECHAENTRADA_FIELD_NAME);
		this.setListaReparaciones(reparacionQb.orderBy(Reparacion.FECHAESTIMADA_FIELD_NAME, true).query());
		return res;
	}

	/**
	 * Permite recepcionar una recepción en la sección
	 * @return actionerror
	 * @throws SQLException
	 */
	@ProporcionaFuncionalidad(identificador = FactoriaFunciones.JEFE_SECCION_RECEPCIONAR_VEHICULO)
	public String recepcionarReparacion() throws SQLException {
		String res = SUCCESS;
		if ( this.getFechaEntradaString().isEmpty() ) {
			addActionError("La fecha de entrada es obligatoria");
			res = ERROR;
		} else {
			this.setReparacionSeleccionadoID(this.getReparacionSeleccionadoID());
			this.setReparacionSeleccionado(FactoriaDAO.recuperar(Reparacion.class, this.getReparacionSeleccionadoID()));
			SimpleDateFormat df = new SimpleDateFormat("dd/MM/yy");
			Date fechaEntrada = null;
			try {
				fechaEntrada = df.parse(this.getFechaEntradaString());
				this.getReparacionSeleccionado().setFechaEntrada(fechaEntrada);
			} catch (ParseException e) {
				addActionError("Formato de la fecha erróneo");
				res = ERROR;
			}		
			this.getReparacionSeleccionado().update();
		}
		return res;
	}
	
	
	
	@Override
	public void setSession(Map<String, Object> session) {
		userSession = session;
		try {
			this.setDatosEmpleado((Usuario) userSession.get("usuario"));
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}
